package eu.epfc.dnet.mastermind.services;

import eu.epfc.dnet.mastermind.hibernate.Tgames;
import eu.epfc.dnet.mastermind.hibernate.TgamesHelper;
import eu.epfc.dnet.mastermind.hibernate.Tlines;
import eu.epfc.dnet.mastermind.hibernate.TlinesHelper;
import eu.epfc.dnet.mastermind.model.beans.Token;
import eu.epfc.dnet.mastermind.model.pojos.Line;
import eu.epfc.dnet.mastermind.model.utils.RandomSolutionGenerator;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;

/**
 *
 * @author Pierre Buvé
 */
@Service
public class GameManager {

    TgamesHelper tgamesHelper;
    TlinesHelper tlinesHelper;

    /*
     * Crée une nouvelle partie @param l'user pour lequel la partie est crée
     * @return le game id de la partie crée
     */
    public int newGame(String username) {
        tgamesHelper = new TgamesHelper();
        List<Token> listSolution = new RandomSolutionGenerator().getNewSolution();
        Tgames tgames = tgamesHelper.createAndGetNewGame(username, listSolution);
        int createdGame = tgames.getId();
        return createdGame;
    }

    /**
     * Retourne la solution correspondant à un gameId
     *
     * @param gameId
     * @return
     */
    public List<Token> getSolutionForGameId(int gameId) {
        List<Token> solutionList = new ArrayList<Token>();
        tgamesHelper = new TgamesHelper();
        Tgames tgames = tgamesHelper.getGameByGameId(gameId);
        solutionList.add(new Token(tgames.getSol01()));
        solutionList.add(new Token(tgames.getSol02()));
        solutionList.add(new Token(tgames.getSol03()));
        solutionList.add(new Token(tgames.getSol04()));
        return solutionList;
    }

    /**
     * Insère une nouvelle ligne dans la base de données.
     *
     * @param proposal
     * @param currentLine
     * @param gameId
     */
    public void insertNewLine(List<Token> proposal, int currentLine, int gameId) {
        tlinesHelper = new TlinesHelper();
        tgamesHelper = new TgamesHelper();
        Tlines tlines = new Tlines();
        tlines.setNumLine(currentLine);
        tlines.setPlayedDate(new Date());
        tlines.setTgames(tgamesHelper.getGameByGameId(gameId));
        tlines.setToken01(proposal.get(0).getColor());
        tlines.setToken02(proposal.get(1).getColor());
        tlines.setToken03(proposal.get(2).getColor());
        tlines.setToken04(proposal.get(3).getColor());
        tlinesHelper.insertNewLine(tlines);
    }

    /**
     * Met à jour les infos de partie dans la base de données.
     *
     * @param gameId
     * @param status
     * @param duration
     */
    public void updateGame(int gameId, String status, int duration) {
        tgamesHelper = new TgamesHelper();
        tgamesHelper.updateGame(gameId, status, duration);
    }

    /**
     * Retourne toutes les lignes pour un gameid recu en paramètre.
     *
     * @param gameId
     * @return
     */
    public List<Line> getAllLinesForGameId(int gameId) {
        tlinesHelper = new TlinesHelper();
        List<Line> resultList = new ArrayList<Line>();

        // va chercher la liste de toutes les Tlines dans la db
        List<Tlines> linesList = tlinesHelper.getAllLinesForGameId(gameId);

        for (int i = 0; i < linesList.size(); i++) {
            //pour chaque Tlines, la transforme en Line
            Line line = new Line();
            line.set(0, new Token(linesList.get(i).getToken01()));
            line.set(1, new Token(linesList.get(i).getToken02()));
            line.set(2, new Token(linesList.get(i).getToken03()));
            line.set(3, new Token(linesList.get(i).getToken04()));
            System.out.println("Ligne créée : " + line.get(0) + " " + line.get(1) + " " + line.get(2) + " " + line.get(3));
            // et add la line à la resultlist (id ligne = place set)
            resultList.add(line);
        }


        return resultList;
    }

    /**
     * Retourne la durée d'une partie pour un gameId donné.
     *
     * @param gameId
     * @return
     */
    public int getDurationForGameId(int gameId) {
        tgamesHelper = new TgamesHelper();
        int duration = tgamesHelper.getDurationForGameId(gameId);
        return duration;
    }
}
